/** * vBulletin 3.8.7 CSS * Style: 'Guild Wars Guru V3B'; Style ID: 13 */ body { background: #AB9C7F; color: #000000; font: 10pt verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; margin: 0px; padding: 0px; } a:link, body_alink { color: #750000; } a:visited, body_avisited { color: #750000; } a:hover, a:active, body_ahover { color: #BD6F01; } .page { color: #000000; } td, th, p, li { font: 10pt verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .tborder { background: #9E8C70; color: #000000; border: 1px solid #000000; } .tcat { background: #AC9D86 url(../Img/forumT2_catbg.gif) repeat-x top left; color: #3C3326; font: bold 10pt verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .tcat a:link, .tcat_alink { color: #3C3326; text-decoration: none; } .tcat a:visited, .tcat_avisited { color: #3C3326; text-decoration: none; } .tcat a:hover, .tcat a:active, .tcat_ahover { color: #000000; text-decoration: underline; } .thead { background: #423A2F url(../Img/forumT2_headbg.gif) repeat-x top left; color: #D8B98D; font: bold 11px tahoma, verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .thead a:link, .thead_alink { color: #D8B98D; } .thead a:visited, .thead_avisited { color: #D8B98D; } .thead a:hover, .thead a:active, .thead_ahover { color: #BD6F01; } .tfoot { background: #AC9D86 url(../Img/forumT2_catbg.gif) repeat-x top left; color: #400F0B; } .tfoot a:link, .tfoot_alink { color: #400F0B; } .tfoot a:visited, .tfoot_avisited { color: #400F0B; } .tfoot a:hover, .tfoot a:active, .tfoot_ahover { color: #000000; } .alt1, .alt1Active { background: #DFD5BF; color: #750000; color: #000; } .alt2, .alt2Active { background: #FBF8ED; color: #000000; background: #cbc1ab; } .inlinemod { background: #FFFFCC; color: #000000; } .wysiwyg { background: #F5F5FF; color: #000000; font: 10pt verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; margin: 5px 10px 10px 10px; padding: 0px; } .wysiwyg a:link, .wysiwyg_alink { color: #22229C; } .wysiwyg a:visited, .wysiwyg_avisited { color: #22229C; } .wysiwyg a:hover, .wysiwyg a:active, .wysiwyg_ahover { color: #FF4400; } textarea, .bginput { font: 10pt verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .bginput option, .bginput optgroup { font-size: 10pt; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .button { font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } select { font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } option, optgroup { font-size: 11px; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .smallfont { font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .time { color: #6E480D; } .navbar { font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .highlight { color: #FF0000; font-weight: bold; } .fjsel { background: #A79983; color: #000000; } .fjdpth0 { background: #A79983; color: #000000; } .panel { background: #DFD5BF; color: #000000; padding: 10px; border: 2px outset; } .panelsurround { background: #888272; color: #000000; } legend { color: #000000; font: 11px tahoma, verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; } .vbmenu_control { background: #591E1E url(../Img/forumT2_menubg.gif) repeat-x bottom left; color: #DFBF82; font: bold 11px tahoma, verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; padding: 3px 6px 3px 6px; white-space: nowrap; } .vbmenu_control a:link, .vbmenu_control_alink { color: #DFBF82; text-decoration: none; } .vbmenu_control a:visited, .vbmenu_control_avisited { color: #DFBF82; text-decoration: none; } .vbmenu_control a:hover, .vbmenu_control a:active, .vbmenu_control_ahover { color: #DFBF82; text-decoration: underline; } .vbmenu_popup { background: #FFFFFF; color: #000000; border: 1px solid #000000; } .vbmenu_option { background: #CFBA99; color: 3B3323; font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; white-space: nowrap; cursor: pointer; } .vbmenu_option a:link, .vbmenu_option_alink { color: 3B3323; text-decoration: none; } .vbmenu_option a:visited, .vbmenu_option_avisited { color: 3B3323; text-decoration: none; } .vbmenu_option a:hover, .vbmenu_option a:active, .vbmenu_option_ahover { color: #000000; text-decoration: none; } .vbmenu_hilite { background: #BCA786; color: #3B3323; font: 11px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; white-space: nowrap; cursor: pointer; } .vbmenu_hilite a:link, .vbmenu_hilite_alink { color: #3B3323; text-decoration: none; } .vbmenu_hilite a:visited, .vbmenu_hilite_avisited { color: #3B3323; text-decoration: none; } .vbmenu_hilite a:hover, .vbmenu_hilite a:active, .vbmenu_hilite_ahover { color: #3B3323; text-decoration: none; } /* ***** styling for 'big' usernames on postbit etc. ***** */ .bigusername { font-size: 14pt; } /* ***** small padding on 'thead' elements ***** */ td.thead, th.thead, div.thead { padding: 4px; } /* ***** basic styles for multi-page nav elements */ .pagenav a { text-decoration: none; } .pagenav td { padding: 2px 4px 2px 4px; } /* ***** de-emphasized text */ .shade, a.shade:link, a.shade:visited { color: #777777; text-decoration: none; } a.shade:active, a.shade:hover { color: #FF4400; text-decoration: underline; } .tcat .shade, .thead .shade, .tfoot .shade { color: #DDDDDD; } /* ***** define margin and font-size for elements inside panels ***** */ .fieldset { margin-bottom: 6px; } .fieldset, .fieldset td, .fieldset p, .fieldset li { font-size: 11px; } #toplinks{ font-family:Tahoma, Arial, Helvetica, sans-serif; font-size: 11px; color: #C1AE8B; margin-top:0px; font-weight: bold; } #toplinks a{font-family:Tahoma,Arial, Helvetica, sans-serif; font-size: 11px;color: #8C7554;text-decoration: none;font-weight: bold;} #toplinks a:hover{font-family:Tahoma,Arial, Helvetica, sans-serif; font-size: 11px;color:#BD6F01;text-decoration: underline;font-weight: bold;} .topwrap { background-image: url(../Img/forumT2_topbg.gif); background-repeat: repeat-x; height: 27px; } .headerwrap { background-image: url(../Img/forumT2_headerbg.gif); background-repeat: repeat-x; height: 183px; } .mmoguru { background-image: url(../Img/forumT2_mmoguru.gif); background-repeat: no-repeat; height: 27px; width: 112px; } .logowrap { background-image: url(../Img/GuildWarsGuru_logo.jpg); background-repeat: no-repeat; height: 183px; width: 233px; } .headerR { background-image: url(../Img/forumT2_headerR.gif); background-repeat: no-repeat; height: 183px; width: 14px; } .topFORMarea { width: 219px; margin: 0px; padding: 0px; } .topwrap .topFORMarea form { padding: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 7px; } .topwrap .topFORMarea select { background-color: #CCCCCC; width: 200px; } .topdivider { background-image: url(../Img/forumT2_topdivider.gif); background-repeat: no-repeat; height: 27px; width: 2px; } .footerwrap { background-image: url(../Img/forumT2_footerbg.gif); background-repeat: repeat-x; height: 100px; } .footerL { background-image: url(../Img/forumT2_footerL.gif); background-repeat: no-repeat; height: 100px; width: 14px; } .footerR { background-image: url(../Img/forumT2_footerR.gif); background-repeat: no-repeat; height: 100px; width: 14px; } .headerADSarea { height: 139px; } .tabArea { height: 44px; } .navHome { height: 44px; width: 62px; } .navForums { height: 44px; width: 73px; } .navSkills { height: 44px; width: 61px; } .navCreatures { height: 44px; width: 87px; } .navAreas { height: 44px; width: 64px; } .navAuctions { height: 44px; width: 80px; } .footertext { font-family: Arial, Helvetica, sans-serif; font-size: 11px; color: #FFF; padding:5px; } #guru_list{position:absolute;top:2px;right:105px;margin-right:100px;z-index:100000} #mmodb_list{position:absolute;top:2px;right:15px;margin-right:10px;z-index:100000} #guru_list_a, #mmodb_list_a {color:#000000;font-weight:bold;background:transparent url(../Img/forum-) no-repeat; width:153px;height:19px;line-height:19px;font-size:11px;font-weight:bold;display:block;text-align:center; text-decoration:none;} #guru_navitems, #mmodb_navitems { background:#ab9c7f; border:1px solid #353841; position: absolute; padding-top:20px; width: 147px; padding:0 2px;margin:0; display:none; left:0; list-style:none; z-index:100000; } #guru_navitems li, #mmodb_navitems li {margin-bottom:2px;} #guru_navitems li a, #mmodb_navitems li a {color:#000000;margin-bottom:2px;} /************************************************************************/ .t-footer { clear:both; position:relative; height:635px; } .t-footer { font:12px/1.5 Arial,Helvetica,sans-serif; background-color:#151515; height:635px; text-shadow:0 -1px 0 rgba(0,0,0,0.6); position:relative; border-top:30px solid #262626; } .t-footer ul, .t-footer li, .t-footer h4 { margin: 0; padding: 0; list-style: none inside none; } .t-footer a { text-decoration: none; } .t-footer:before,.t-footer:after { content:""; display:table; } .t-footer:after { clear:both; } .ie8 .t-footer { zoom:1; } .t-footer a { color:white; font-family:Arial,Helvetica,sans-serif; white-space:nowrap; } .t-footer a:visited { color:white; } .t-footer a:hover { color:white; text-decoration:none; } .t-footer a>strong { color:#ff5f14; } .t-footer a>strong:hover { color:white; } .t-footer h1,.t-footer h2,.t-footer h3,.t-footer h4,.t-footer h5,.t-footer h6 { color:white; font-family:Arial,Helvetica,sans-serif; letter-spacing:0; } .t-footer .t-footer-wrapper { width:1000px; margin:0 auto; padding:40px 0; } .t-footer .t-footer-wrapper:before,.t-footer .t-footer-wrapper:after { content:""; display:table; } .t-footer .t-footer-wrapper:after { clear:both; } .ie8 .t-footer .t-footer-wrapper { zoom:1; } .t-footer .t-footer-curseInfo { float:left; width:31.96667%; margin-left:2.05%; margin-left:0; position:relative; z-index:2; border-right:1px solid #333; } .ie7 .t-footer .t-footer-curseInfo { width:30.96667%; } .t-footer .t-footer-curseInfo hgroup { margin-bottom:15px; margin-right:15px; margin-top:-40px; } .t-footer .t-footer-curseInfo hgroup h1 { background-image:url(../Img/curse-logo.png); margin-bottom:15px; width:225px; height:93px; text-indent:-99999px; } .t-footer .t-footer-curseInfo hgroup h2 { font-size:12px; font-weight:normal; color:white; } .t-footer .t-footer-curseInfo hgroup>strong { font-weight:bold; } .t-footer .t-footer-curseInfo .t-footer-signUp { background:#262626; -webkit-border-radius:8px; -moz-border-radius:8px; -ms-border-radius:8px; -o-border-radius:8px; border-radius:8px; padding:15px; margin:0 15px 30px 0; text-align:center; } .t-footer .t-footer-curseInfo .t-footer-signUp>h4,.t-footer .t-footer-curseInfo .t-footer-signUp h5 { font-size:20px; font-weight:bold; color:white; line-height:1.2em; text-shadow:0 1px 1px #000; } .t-footer .t-footer-curseInfo .t-footer-signUp h5 { margin-bottom:10px; font-weight:normal; color:#e6e6e6; } .t-footer .t-footer-curseInfo .t-footer-signUp .u-button { background-color:#EA8F20; background-image:0; background-image:0; background-image:0; background-image:0; background-image:linear-gradient(top,#ea8f20,#c56711); -webkit-border-radius:4px; -moz-border-radius:4px; -ms-border-radius:4px; -o-border-radius:4px; border-radius:4px; -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); -moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); -ms-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); -o-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05); text-shadow:0 -1px 0 rgba(0,0,0,0.25); border-color:#C56711 #C56711 #EA8F20; border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25); overflow:hidden; color:#fff; padding:10px 30px; font-weight:bold; font-size:16px; display:block; text-align:center; } .t-footer .t-footer-curseInfo .t-footer-socialLinks:before,.t-footer .t-footer-curseInfo .t-footer-socialLinks:after { content:""; display:table; } .t-footer .t-footer-curseInfo .t-footer-socialLinks:after { clear:both; } .ie8 .t-footer .t-footer-curseInfo .t-footer-socialLinks { zoom:1; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li { float:left; width:23.4625%; margin-left:2.05%; } .ie7 .t-footer .t-footer-curseInfo .t-footer-socialLinks li { width:22.4625%; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a { display:block; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i { display:block; margin:0 auto; background:url(../Img/icon-social-links.png) no-repeat 0 0; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-youtube { width:64px; height:26px; background-position:0 0; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-youtube:hover { background-position:0 -28px; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-twitter { width:37px; height:27px; background-position:-66px 0; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-twitter:hover { background-position:0 -56px; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-facebook { width:16px; height:32px; background-position:-105px 0; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-facebook:hover { background-position:-105px -34px; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-rss { width:27px; height:27px; background-position:-39px -56px; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li a i.u-icon-rss:hover { background-position:-68px -56px; } .t-footer .t-footer-curseInfo .t-footer-socialLinks li:first-child { margin-left:0; } .t-footer .t-footer-curseNetwork { float:left; width:65%; margin-left:2.05%; border-top:1px solid #333; } .ie7 .t-footer .t-footer-curseNetwork { width:64.98333%; } .t-footer .t-footer-curseNetwork header>h4 { position:relative; top:-9px; background:#151515; padding:0 10px 0 0; display:inline-block; font-size:14px; font-weight:bold; } .t-footer .t-footer-curseNetwork .t-footer-jumpLink { float:right; position:relative; top:-9px; padding:0 10px; font-size:10px; height:16px; line-height:16px; text-transform:uppercase; font-weight:bold; background:#383838; -webkit-border-radius:6px; -moz-border-radius:6px; -ms-border-radius:6px; -o-border-radius:6px; border-radius:6px; } .t-footer .t-footer-curseNetwork .t-footer-jumpLink:hover { background:#ff5f14; color:#fff; } .t-footer .t-footer-curseNetwork .t-footer-featured { border-bottom:1px solid #333; overflow:hidden; padding-bottom:1.5em; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem { float:left; width:23.4625%; margin-left:2.05%; } .ie7 .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem { width:22.4625%; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem:first-child { margin-left:0; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem h4 { text-indent:-9999px; display:block; width:146px; height:102px; background-repeat:no-repeat; background-position:0 0; margin:0; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem.site-gw2g h4 { background-image:url(../Img/featured-gw2g.png); } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem.site-lolpro h4 { background-image:url(../Img/featured-lolpro.png); } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem.site-mmoc h4 { background-image:url(../Img/featured-mmoc.png); } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem.site-gw2db h4 { background-image:url(../Img/featured-gw2db.png); } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem a { display:block; cursor:pointer; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem a:hover h4 { background-position:0 -102px; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem dl { margin:0; background:#262626; -webkit-border-bottom-right-radius:8px; -moz-border-bottom-right-radius:8px; -ms-border-bottom-right-radius:8px; -o-border-bottom-right-radius:8px; border-bottom-right-radius:8px; -webkit-border-bottom-left-radius:8px; -moz-border-bottom-left-radius:8px; -ms-border-bottom-left-radius:8px; -o-border-bottom-left-radius:8px; border-bottom-left-radius:8px; width:126px; padding:5px 10px; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem dl dt { font-weight:bold; color:#fff; } .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem dl dd { margin:0; font-size:11px; white-space:normal; line-height:13px; color:#ddd; } .t-footer .t-footer-curseNetwork .t-footer-browse { position:relative; padding-left:170px; } .t-footer .t-footer-curseNetwork .t-footer-browse:before,.t-footer .t-footer-curseNetwork .t-footer-browse:after { content:""; display:table; } .t-footer .t-footer-curseNetwork .t-footer-browse:after { clear:both; } .ie8 .t-footer .t-footer-curseNetwork .t-footer-browse { zoom:1; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>a { position:absolute; left:0; width:150px; font-weight:bold; color:#4b4b4b; text-shadow:0 1px 0 #000; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>a.j-selected,.t-footer .t-footer-curseNetwork .t-footer-browse>li>a:hover { background:#2c2c2c; color:#ff5f14; } .t-footer .t-footer-curseNetwork .t-footer-browse>li.t-footer-coreLinks>a { top:0; } .t-footer .t-footer-curseNetwork .t-footer-browse>li.t-footer-communityLinks>a { top:20px; } .t-footer .t-footer-curseNetwork .t-footer-browse>li.t-footer-databaseLinks>a { top:40px; } .t-footer .t-footer-curseNetwork .t-footer-browse>li.t-footer-wikiLinks>a { top:60px; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul { display:none; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul:before,.t-footer .t-footer-curseNetwork .t-footer-browse>li>ul:after { content:""; display:table; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul:after { clear:both; } .ie8 .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul { zoom:1; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul>li { float:left; width:143px; margin:0 20px 2px 0; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul>li a { display:block; background:#2c2c2c; padding:0 3px; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul>li a:hover { background:#383838; color:#ff5f14; } .t-footer .t-footer-curseNetwork .t-footer-browse>li>ul.j-list-selected { display:block; } .t-footer .t-footer-curseLinks { background:#191919; clear:both; } .t-footer .t-footer-curseLinks>ul { width:1000px; margin:0 auto; text-align:center; padding:30px 0; } .t-footer .t-footer-curseLinks>ul:before,.t-footer .t-footer-curseLinks>ul:after { content:""; display:table; } .t-footer .t-footer-curseLinks>ul:after { clear:both; } .ie8 .t-footer .t-footer-curseLinks>ul { zoom:1; } .t-footer .t-footer-curseLinks>ul>li { display:0; -moz-box-orient:vertical; display:inline-block; vertical-align:middle; margin:0 8px; font-size:11px; text-transform:uppercase; } .t-footer .t-footer-curseLinks>ul>li a { color:#666; } .t-footer .t-footer-curseLinks>ul>li a:hover { color:#ff5f14; } .t-footer .t-footer-createdBy { background:#101010; clear:both; text-align:center; color:#4d4d4d; padding:20px 0 40px; text-transform:uppercase; } .t-footer .t-footer-createdBy>* { display:0; -moz-box-orient:vertical; display:inline-block; vertical-align:middle; } .t-footer .t-footer-createdBy .curse-logo { background-image:url(../Img/icon-curse-logo-footer.png); width:35px; height:50px; margin:0 1em; } .t-footer .t-footer-createdBy .happy-pants { display:block; clear:both; margin-bottom:0; padding:20px 0 0; } .t-footer .return-to-top { background:url(../Img/icon-back_to_top.png) no-repeat right center; padding-right:24px; position:absolute; top:-30px; width:1000px; margin:0 auto; text-align:right; display:block; font-size:11px; font-weight:bold; height:30px; line-height:30px; } .t-footer .return-to-top a:hover { color:#ff5f14; } /* --------------------------------------------------------------------------- Footer ad hack, remove after code push -JB (4/18/13) - Specificity issues due to old code --------------------------------------------------------------------------- */ /* Temp Wrapper */ .show-ads { position: relative; } /* Header */ .show-ads .t-footer .t-footer-curseNetwork { border-top: none; } .show-ads .t-footer-curseNetwork > header:first-child { border-top: 1px solid #333; width: 50%; } .show-ads .t-footer-curseNetwork > header:first-child .t-footer-jumpLink { margin-right: 10px; position: relative; } .show-ads .t-footer-curseNetwork > header:first-child .t-footer-jumpLink:after { background: #151515; content: ""; height: 100%; position: absolute; left: 100%; width: 10px; } /* Featured Items */ .show-ads .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem { float: none; margin-left: 0; overflow: hidden; width: 50%; } .show-ads .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem h4 { float: left; position: relative; z-index: 2; } .show-ads .t-footer .t-footer-curseNetwork .t-footer-featured .t-footer-featureItem dl { border-radius: 0 8px 8px 0; height: 91px; overflow: hidden; padding-left: 28px; position: relative; top: 11px; left: -10px; width: auto; } /* Remove 3rd & 4th featured sites */ .show-ads .t-footer .t-footer-featureItem:nth-child(3), .show-ads .t-footer .t-footer-featureItem:nth-child(4) { position: absolute; left: -99999px; } /* Med Rect */ .show-ads .footer-ad-medRect { margin-right: -490px; position: absolute; top: 45px; right: 50%; } Thoughts on database management in MMORPGs such as Guild Wars - Guild Wars Forums - GW Guru
Guild Wars Forums - GW Guru
 
 

Go Back   Guild Wars Forums - GW Guru > The Inner Circle > The Riverside Inn

Notices

Reply
 
Thread Tools Display Modes
Old Jun 12, 2007, 04:55 PM // 16:55   #1
Forge Runner
 
Join Date: Dec 2005
Advertisement

Disable Ads
Default Thoughts on database management in MMORPGs such as Guild Wars

Following up on my three prior blog posts, and the discussion thread here around them, I have added some new thoughts on how database technology could enhance the Guild Wars experience.

Excerpt:

Rather, where I think the Guild Wars developers at ArenaNet may be greatly missing out is in the areas of business intelligence, data mining, and associated game control. Here are some examples of analyses they surely would find it helpful to do.

Quote:
* When they find a “gold-seller” — somebody who plays the game professionally and sells in-game commodities for real money – what are the characteristics of that account? E.g., what patterns of trading and/or playing behavior reliably flag a seller, as opposed to a generous person who makes gifts to friends?
* Which rare loot is the most popular to be kept by “wealthy” players?
* Which skills are use by whom in what ways?
* Which modifications are deployed on the equipment players actually use?

And I could keep going.
From http://www.dbms2.com/2007/06/12/thou...playing-games/

Thanks to those who posted in the other thread, especially GranDeWun and ArcaneMacabre.
Francis Crawford is offline   Reply With Quote
Old Jun 12, 2007, 05:17 PM // 17:17   #2
Forge Runner
 
Join Date: Jan 2006
Default

Not necessarily.

All it means that rather than converting game objects into SQL representation, they stored serialized data.

The difference is in that in order to access this data, they need to write code, rather than use SQL.

The non-SQL aproach is very common in games, since several queries per player can mean an unmanagable performance hit. And any kind of ORM is almost always out of question, unless hardware and administrative teams are readily available.

There's a lot of compromises to be made. The Blob aproach also seems somewhat redundant, they could just drop the each player into a file.

Also, seeing as Anet had a job posting for data mining analyst, I'd conclude that gameplay activities are logged - just not in the same database. It seems somewhat unimaginable that they'd have the game running for 2+ years, and not have a single record of any activity that was going on.

The examples you list, for example, are all those unrelated to object store, but are only created during gameplay (it's unrelated to the parts discussed in the articles). So I wouldn't go as far as to say they have no clue what's going on in the game.
Antheus is offline   Reply With Quote
Old Jun 13, 2007, 02:41 AM // 02:41   #3
Forge Runner
 
Join Date: Dec 2005
Default

Quote:
Originally Posted by Antheus
The difference is in that in order to access this data, they need to write code, rather than use SQL.
Good point.

Quote:
Originally Posted by Antheus
The non-SQL aproach is very common in games, since several queries per player can mean an unmanagable performance hit. And any kind of ORM is almost always out of question, unless hardware and administrative teams are readily available.
What kind of research or experience are you speaking from?

Quote:
Originally Posted by Antheus

Also, seeing as Anet had a job posting for data mining analyst, I'd conclude that gameplay activities are logged - just not in the same database. It seems somewhat unimaginable that they'd have the game running for 2+ years, and not have a single record of any activity that was going on.
The question is how MUCH they have logged. And there are marketing databases as well as game-record ones.

Indeed, the statistical analysis can be harder if the data is weaker.

Quote:
Originally Posted by Antheus

The examples you list, for example, are all those unrelated to object store, but are only created during gameplay (it's unrelated to the parts discussed in the articles).
Only about half-true. Look again.
Francis Crawford is offline   Reply With Quote
Old Jun 13, 2007, 11:40 AM // 11:40   #4
Krytan Explorer
 
Cymmina's Avatar
 
Join Date: Apr 2005
Profession: Me/N
Default

A conversation with another experienced DB persion:

Me: So Guild Wars stores character data as a blob, wow that's dumb.
Him: How did you think they were going to do it? It's common to put them in flat files for games.
Me: No, they put the blob in the DB.
Him: Wow, that **is** dumb.

I guess now we know why it takes so long to get retroactive changes to existing equipment. Preserving data integrity through foreign keys is a lost concept to them.
Cymmina is offline   Reply With Quote
Old Jun 13, 2007, 06:07 PM // 18:07   #5
Lion's Arch Merchant
 
Join Date: May 2005
Profession: N/Me
Default

I haven't read any of the blogs or discussion threads but I was under the impression that the decision to run with the current system was based on having op costs at a level consistent with the fee structure rather than more expensive popular database alternatives. Low costs don't come without sacrifices and I'm sure these were weighed accordingly.

My knowledge of databases is limited to an undergrad computer science education I left behind years ago, but the examples from the excerpt are basic and obvious questions raised during the preliminary stages of design and planning. Certainly fundamental issues like these were addressed fairly early? Regardless, since Anet received the financial backing necessary to launch GW that means they were able to successfully defend their choice to those with much more expertise (and money) than myself.

Do you believe they could have pulled off the GW experiment with an option less profitable for investors?
Taki is offline   Reply With Quote
Old Jun 14, 2007, 02:34 PM // 14:34   #6
Wilds Pathfinder
 
GranDeWun's Avatar
 
Join Date: May 2005
Default

I've worked on a trading system that stored its results as BLOBS, and reporting was a total nightmare. Every report was a program that had to de-BLOB the entire set and run the query. No ad-hoc reports were possible, because someone had to code every one.

By contrast, if you had a true relational database, you could idly run queries to find out things like: "How many Mo/Ws are currently in area x?" "How many 100 plat cash trades took place last week where no item was traded".

Basically, all the db capabilities are lost...

And by the way...Sneaky is not following the argument. You don't 'send something' as a BLOB, that IS the way it is stored. It is like you stuck all the columns of a spreadsheet in the first column. And serialization is another topic completely.

Last edited by GranDeWun; Jun 14, 2007 at 02:41 PM // 14:41..
GranDeWun is offline   Reply With Quote
Old Jun 14, 2007, 03:14 PM // 15:14   #7
Desert Nomad
 
Shanaeri Rynale's Avatar
 
Join Date: Aug 2005
Guild: DVDF(Forums)
Profession: Me/N
Default

The blob approach also explains why it's not possible to rollback individual players accounts or recover them if deleted. It may also be why things such as hairdressers/apperance changers are so difficult to implement.

I'm sure it has some advantages e.g security but it does seem very limiting in the above aspects. I hope they will revisit the design for GW2 to allow a more flexible design that has increased data integrity and yet the same or greater data security.
Shanaeri Rynale is offline   Reply With Quote
Old Jun 14, 2007, 03:20 PM // 15:20   #8
Wilds Pathfinder
 
GranDeWun's Avatar
 
Join Date: May 2005
Default

As to other games, I'm pretty sure the EVE developers have a fully relational database, IIRC the discussions on that forum. Maybe data warehousing as well. And I don't buy the claim that SQL queries from players are a performance problem per se; after all you could always do one big query at the beginning which would be just like retrieving the BLOB.

I would be interested to see how many games started with a DBA and a good data model versus using the database as just storage. I've seen a lot of web-based apps that ignored the database until they were way down the road, with many painful issues later.

Last edited by GranDeWun; Jun 14, 2007 at 03:26 PM // 15:26..
GranDeWun is offline   Reply With Quote
Old Jun 14, 2007, 03:39 PM // 15:39   #9
Forge Runner
 
Join Date: Dec 2005
Default

Quote:
Originally Posted by GranDeWun
As to other games, I'm pretty sure the EVE developers have a fully relational database, IIRC the discussions on that forum. Maybe data warehousing as well. And I don't buy the claim that SQL queries from players are a performance problem per se; after all you could always do one big query at the beginning which would be just like retrieving the BLOB.

I would be interested to see how many games started with a DBA and a good data model versus using the database as just storage. I've seen a lot of web-based apps that ignored the database until they were way down the road, with many painful issues later.
I look forward to further research, but at the moment my firm knowledge as to what non-GW games do for database management is sparse, and indeed pretty well limited to:

1. The GW guys previously worked on WOW, and I got the impression from talking with them the WOW has a straightforward RDBMS approach.

2. Everquest is in the process of being ported from Oracle to the the Oracle-plug-compatible products from EnterpriseDB.
Francis Crawford is offline   Reply With Quote
Old Jun 14, 2007, 03:47 PM // 15:47   #10
Wilds Pathfinder
 
GranDeWun's Avatar
 
Join Date: May 2005
Default

My other question would be to what extent stored procedures are used, which in my experience make all the difference in performance. To illustrate in a simple way, pulling 1000 rows from the database to identify the ten you want (not uncommonly done) , is infinitely worse that running a proc to do it on the dbase side and returning just the ten.
GranDeWun is offline   Reply With Quote
Old Jun 14, 2007, 07:19 PM // 19:19   #11
Academy Page
 
Join Date: Nov 2005
Guild: Fifteen Over Fifty[Rare]
Profession: R/Mo
Post

Quote:
Originally Posted by Shanaeri Rynale
It may also be why things such as hairdressers/apperance changers are so difficult to implement.
This so far as I can tell, is not easily feasible with the current system.

Note: This is from a client perspective.

The current profession and hair style are stored in a single byte. This will be looked at in hexadecimal(base 16, 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f) The minimum value of a byte is 0x00 and the maximum is 0xFF. For a female Ranger with the first hair style, the byte would be 0x21. Changing it to 0x31 would change the character to a Monk and using the female Monk's first hair style. So the first half controls the profession and the second half controls what hair style. This effectively limits the max number of professions to 15 (profession 0 does not exist), and the max number of hairstyles for a profession to 16. Ever wonder why those selection boxes are 4X4?

The way the game accommodates far more than sixteen hair styles is by making the hair style number relative to the character's campaign, profession, and sex.

Campaign(Prophecies, Factions, Nightfall, etc.) -> Profession(Warrior,Ranger,Monk,etc.) -> Sex(male, female) -> max 16 faces/hair styles.

Now an appearance/hair stylist would have to stay within the bounds of the faces available to that particular campaign->profession->sex. This should be easily possible as evidenced by the April Fools joke. That was likely executed by modifying the byte that controls the height and sex. 0xA1 would make the character 10(A) units tall and be female. I've found that an odd value is female and male is even. For the joke all they had to do was change an odd value to even and vice-versa.

I think the greater problem with hairdressers/appearance changers would be the demand the community would have for cross campaign/profession hair styles and faces. Which is not possible without adding more bytes. With character data being stored as a BLOB it would require changing the code that interprets this data which is probably quite a lot.
LAMS3K is offline   Reply With Quote
Old Jun 14, 2007, 07:46 PM // 19:46   #12
Wilds Pathfinder
 
GranDeWun's Avatar
 
Join Date: May 2005
Default

You could do it by adding 2 bits to the stored BLOB to represent a 'campaign shift', which would allow you to say appearance is a function of shifted campaign, profession, sex, 1-16. 2 bits to handle a shift of 0,1,2 campaigns. Client code would change slightly as well, of course.

Last edited by GranDeWun; Jun 14, 2007 at 07:49 PM // 19:49..
GranDeWun is offline   Reply With Quote
Reply

Share This Forum!  
 
 
           

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 10:42 AM // 10:42.


Powered by: vBulletin
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
jQuery(document).ready(checkAds()); function checkAds(){if (document.getElementById('adsense')!=undefined){document.write("_gaq.push(['_trackEvent', 'Adblock', 'Unblocked', 'false',,true]);");}else{document.write("